sing-box tun配置

·

sing-box 配置tun的原理

# Routing Policy DataBase
sudo ip rule add priority 9000 from all to 172.20.0.0/30 table 2022  
sudo ip rule add priority 9003 not iif lo lookup 2022
# 9003: not from all iif lo lookup 2022  # 生成的结果中自动添加了from all

ip rule

0:    from all lookup local
9000: from all to 172.20.0.0/30 lookup 2022
# 不匹配路由前缀为0(不匹配缺省路由)
9001: from all lookup 2022 suppress_prefixlength 0
# 地址非53端口的所有流量
9002: not from all dport 53 lookup main suppress_prefixlength 0
9002: from all ipproto icmp goto 9010
9002: from all iif tun0 goto 9010
9003: not from all iif lo lookup 2022
9003: from 0.0.0.0 iif lo lookup 2022
9003: from 172.20.0.0/30 iif lo lookup 2022
9010: from all nop
32766: from all lookup main
32767: from all lookup default
ip route show table 2022
default dev tun0

ip route show table main
default via 11.11.11.1 dev pppoe-wan proto static
11.11.11.1 dev pppoe-wan proto kernel scope link src 11.11.11.5
192.168.11.0/24 dev br-lan proto kernel scope link src 192.168.11.1

创建路由名称 并使路由生效

echo 100 custom >> /etc/iproute2/rt_tables 
ip route add default via 192.168.1.100 dev eth1 table custom
ip rule add to 192.168.1.200 lookup custom

fwmark

iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1  
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2  
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2  
iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3  
ip rule add fwmark 1 table 1  
ip rule add fwmark 2 table 2  
ip rule add fwmark 3 table 3

使用 ip rule 配置路由规则

内核需要根据规则,来为数据包选择要进行的操作或选择使用的路由表——当数据包能够匹配某些规则,则对该数据包执行该规则所对应的动作,比如查找一个路由表。Linux 的默认规则会让入向和出向的流量都 "lookup" 默认路由表。

添加路由规则的 ip rule 用法如下:

  • ip rule add {prefix} {selector} {predicate}

  • ip rule add 的意思很好理解,就是使用其后的参数,添加一个新的规则。prefix 表示该规则的应用范围——是入向流量还是出向流量。selector 表示需要使用的过滤条件。predicate 的意思是谓语,表示 selector 的对象或要执行的动作。

    • prefix: from {addr} | to {addr}
    • selector: to {addr} | priority <#> | fwmark | iif | oif | tos
    • predicate: {blackhole | prohibited | unreachable} | lookup
    • prefix 是源地址和/或目的地址,可以是单一 IP 地址或一个地址段。from 后接源地址/地址范围,to 后接目的地址/地址范围。也可以用 all 表示所有地址。这里的 from 和 to 会被用来对数据包进行匹配,能够匹配上的则会被应用该条规则;

    • selector 可以对数据包进行进一步的过滤,同一条规则中可以使用多个 selector。常用的 selector 有下面几种:

      • fwmark:数据包的标记值,在命令中填的 10 进制数字会被转成 16 进制存储和使用,如果要使用 16 进制表示,则需要在前面加个 x。需要注意的是,fwmark(FireWall MARK)只能由 iptables 添加;
      • iif:入向接口名称;
      • oif:出向接口名称;
      • priority:本条规则的优先级,数字越小,优先级越高。该值必须是唯一的,即,不允许出现两条优先级相同的路由规则;
      • tos:Type of Service,服务类型;
      • ipproto:ip 层协议类型;
      • sport、dport:源端口及目的端口,可以是特定端口或端口范围
    • predicate 表示当本条规则匹配成功时要执行的动作,包括:

      • lookup:查找要使用的路由表;
      • unreachable:设置该路由不可达,数据包会被丢弃,ICMP 会返回 host unreachable,发送代码会报错 EHOSTUNREACH ;
      • blackhole(黑洞):数据包会被无声丢弃(discarded silently),发送代码会报错 EINVAL ;
      • prohabit(禁止):数据包会被丢弃并给一个报错。ICMP 会返回 communication administratively prohibited。发送代码会报错 EACCES;
      • 需要注意的是,ip rule 并不能对数据包添加标记,而只能检查 fwmark 值,并根据该值确定如何处理数据包
    • ip rule 优先级

      这里的优先级指的是使用 ip rule 的 priority 选项设置的优先级。这个优先级实际上是最后才会发挥作用的——只有当多条规则的其他部分(from / to,过滤规则等)都完全相同时,系统才会根据该值选择真正要使用的规则。

      如果用命令设置规则的时候没有指定优先级,则系统会自动为该规则添加一个比【最近使用的规则的优先级高一级】的优先级值。比如最近用的一条路由规则的优先级为 100 ,则新添加的一条规则的优先级值就是 99。

      调试

      • 用 TRACE 调试路由
      • 开启 debug:
      echo 65535 > /proc/sys/net/ipv4/rt_trace_max_size
      sysctl -w net.core.netdev_max_backlog=5000
      
      rtmon rt filter
      # 可以看到 RPDB 的逐条匹配过程。